﻿#ifndef __YNDATA_H__
#define __YNDATA_H__

#include <string>
#include <map>
#include <vector>

#ifdef _WIN32  //32 &64
#ifdef YNEXPORT
//动态链接库项目调用
#define YNAPI  __declspec(dllexport)
#else
//执行程序调用
#define YNAPI  __declspec(dllimport)
#endif
#else  //linux mac
#define YNAPI
#endif

namespace YN {
	enum YN_OPT {
		YN_OPT_CONNECT_TIMEOUT,
		YN_OPT_COMPRESS,
		YN_OPT_NAMED_PIPE,
		YN_INIT_COMMAND,
		YN_READ_DEFAULT_FILE,
		YN_READ_DEFAULT_GROUP,
		YN_SET_CHARSET_DIR,
		YN_SET_CHARSET_NAME,
		YN_OPT_LOCAL_INFILE,
		YN_OPT_PROTOCOL,
		YN_SHARED_MEMORY_BASE_NAME,
		YN_OPT_READ_TIMEOUT,
		YN_OPT_WRITE_TIMEOUT,
		YN_OPT_USE_RESULT,
		YN_REPORT_DATA_TRUNCATION,
		YN_OPT_RECONNECT,
		YN_PLUGIN_DIR,
		YN_DEFAULT_AUTH,
		YN_OPT_BIND,
		YN_OPT_SSL_KEY,
		YN_OPT_SSL_CERT,
		YN_OPT_SSL_CA,
		YN_OPT_SSL_CAPATH,
		YN_OPT_SSL_CIPHER,
		YN_OPT_SSL_CRL,
		YN_OPT_SSL_CRLPATH,
		YN_OPT_CONNECT_ATTR_RESET,
		YN_OPT_CONNECT_ATTR_ADD,
		YN_OPT_CONNECT_ATTR_DELETE,
		YN_SERVER_PUBLIC_KEY,
		YN_ENABLE_CLEARTEXT_PLUGIN,
		YN_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
		YN_OPT_MAX_ALLOWED_PACKET,
		YN_OPT_NET_BUFFER_LENGTH,
		YN_OPT_TLS_VERSION,
		YN_OPT_SSL_MODE,
		YN_OPT_GET_SERVER_PUBLIC_KEY,
		YN_OPT_RETRY_COUNT,
		YN_OPT_OPTIONAL_RESULTSET_METADATA,
		YN_OPT_SSL_FIPS_MODE
	};

	enum FIELD_TYPE {
		YN_TYPE_DECIMAL,
		YN_TYPE_TINY,
		YN_TYPE_SHORT,
		YN_TYPE_LONG,
		YN_TYPE_FLOAT,
		YN_TYPE_DOUBLE,
		YN_TYPE_NULL,
		YN_TYPE_TIMESTAMP,
		YN_TYPE_LONGLONG,
		YN_TYPE_INT24,
		YN_TYPE_DATE,
		YN_TYPE_TIME,
		YN_TYPE_DATETIME,
		YN_TYPE_YEAR,
		YN_TYPE_NEWDATE, /**< Internal to MySQL. Not used in protocol */
		YN_TYPE_VARCHAR,
		YN_TYPE_BIT,
		YN_TYPE_TIMESTAMP2,
		YN_TYPE_DATETIME2, /**< Internal to MySQL. Not used in protocol */
		YN_TYPE_TIME2,     /**< Internal to MySQL. Not used in protocol */
		YN_TYPE_JSON = 245,
		YN_TYPE_NEWDECIMAL = 246,
		YN_TYPE_ENUM = 247,
		YN_TYPE_SET = 248,
		YN_TYPE_TINY_BLOB = 249,
		YN_TYPE_MEDIUM_BLOB = 250,
		YN_TYPE_LONG_BLOB = 251,
		YN_TYPE_BLOB = 252,
		YN_TYPE_VAR_STRING = 253,
		YN_TYPE_STRING = 254,
		YN_TYPE_GEOMETRY = 255
	};

	struct YNAPI YNData
	{
		YNData(const char* data = 0);
		YNData(const int *d);
		//读取文件，内容写入到data，size大小 ,会在堆中申请data的空间，需要用Drop释放
		bool LoadFile(const char* filename);
		bool SaveFile(const char * filename);
		//释放LoadFile申请的data空间
		void Drop();
		std::string UTF8ToGBK();
		std::string GBKToUTF8();
		FIELD_TYPE type;
		const char * data = 0;
		int size = 0;
	};

	//插入和更新数据的数据结构
	typedef std::map <std::string, YNData> XDATA;

	//数据列表
	typedef std::vector<std::vector<YNData>> XROWS;
}

#endif //__YNDATA_H__
